﻿using Interface.DAO;
using JMI_Nucleo.Classe;
using JMI_Nucleo.Enumerador;
using JMI_Nucleo.JMIProvider;
using OR;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Dao
{
    public class CategoriaFuncionarioDao : ICategoriaFuncionarioDao<mCategoriaFuncionario>
    {
        private mCategoriaFuncionario infoCategoriaFuncionario;

        public CategoriaFuncionarioDao()
        {
        }

        #region Comando SQL
        const string cmdInsertSQL = @"INSERT INTO cadastro.categoriafuncionario(datacadastro, empresa, usuario, 
                                      dataalteracao, ativo, codigo, descricao) 
                                      VALUES(@datacadastro, @empresa, @usuario, @dataalteracao, @ativo, 
                                      @codigo, @descricao)";

        const string cmdUpdateSQL = @"UPDATE cadastro.categoriafuncionario SET usuario=@usuario, 
                                      dataalteracao=@dataalteracao, ativo=@ativo, descricao=@descricao ";

        const string cmdDeleteSQL = @"DELETE FROM cadastro.categoriafuncionario ";

        const string cmdSelectSQL = @"SELECT datacadastro, empresa, usuario, dataalteracao, ativo, codigo, 
                                             descricao FROM cadastro.categoriafuncionario ";

        const string cmdRetornaCodigo = @"SELECT codigo FROM cadastro.categoriafuncionario
                                     WHERE descricao = @PAR_DESCRICAO AND empresa =@PAR_EMPRESA";

        const string cmdRetornaNome = @"SELECT descricao FROM cadastro.categoriafuncionario
                                     WHERE codigo =@PAR_CODIGO AND empresa =@PAR_EMPRESA";

        #endregion
  
        #region Metodos Publicos
        bool ICategoriaFuncionarioDao<mCategoriaFuncionario>.Inserir(mCategoriaFuncionario infoCategoriaFuncionario)
        {
            bool sucesso = false;
            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                _cmd.CommandText = cmdInsertSQL;
                GeraParametro(ref _cmd, infoCategoriaFuncionario, 1);
                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);                
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = " bool ICategoriaFuncionarioDao<mCategoriaFuncionario>.Inserir(mCategoriaFuncionario infoCategoriaFuncionario)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        bool ICategoriaFuncionarioDao<mCategoriaFuncionario>.Alterar(mCategoriaFuncionario infoCategoriaFuncionario)
        {
            bool sucesso = false;
            DbParameter p = null;
            string cmdSQL = String.Empty;

            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdUpdateSQL;
                cmdSQL += "WHERE codigo =@PAR_CODIGO AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;
                
                GeraParametro(ref _cmd, infoCategoriaFuncionario, 2);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_CODIGO";
                p.Value = infoCategoriaFuncionario.Codigo;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = infoCategoriaFuncionario.CodigoEmpresa;
                _cmd.Parameters.Add(p);

                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);                
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool ICategoriaFuncionarioDao<mCategoriaFuncionario>.Alterar(mCategoriaFuncionario infoCategoriaFuncionario)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        bool ICategoriaFuncionarioDao<mCategoriaFuncionario>.Excluir(int Codigo, short Empresa)
        {
            bool sucesso = false;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdDeleteSQL;
                cmdSQL += "WHERE codigo =@PAR_CODIGO AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_CODIGO";
                p.Value = infoCategoriaFuncionario.Codigo;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = infoCategoriaFuncionario.CodigoEmpresa;
                _cmd.Parameters.Add(p);

                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);       
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool ICategoriaFuncionarioDao<mCategoriaFuncionario>.Excluir(int Indice, short Empresa)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        mCategoriaFuncionario ICategoriaFuncionarioDao<mCategoriaFuncionario>.GetCategoriaFuncionario(int Codigo, short Empresa)
        {
            infoCategoriaFuncionario = new mCategoriaFuncionario();
            DbDataReader rd = null;
            DbCommand _cmd = null;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdSelectSQL;
                cmdSQL += "WHERE codigo =@PAR_CODIGO AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_CODIGO";
                p.Value = Codigo;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                rd = EngineBD.ExecuteDataReader(_cmd);

                if (rd.Read())
                    infoCategoriaFuncionario = GetRd(rd);

                return infoCategoriaFuncionario;
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "mCategoriaFuncionario ICategoriaFuncionarioDao<mCategoriaFuncionario>.GetCategoriaFuncionario(int Codigo, short Empresa)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            finally
            {
                rd.Close();
            }
            return infoCategoriaFuncionario;
        }

        List<mCategoriaFuncionario> ICategoriaFuncionarioDao<mCategoriaFuncionario>.GetLista(short Empresa)
        {
            mCategoriaFuncionario infoCategoriaFuncionario;
            List<mCategoriaFuncionario> lst = new List<mCategoriaFuncionario>();
            DbDataReader rd = null;
            DbCommand _cmd = null;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdSelectSQL;
                cmdSQL += "WHERE empresa =@PAR_EMPRESA ";

                cmdSQL += "ORDER BY descricao";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                rd = EngineBD.ExecuteDataReader(_cmd);

                while (rd.Read())
                {
                    infoCategoriaFuncionario = new mCategoriaFuncionario();
                    infoCategoriaFuncionario.Codigo = Convert.ToInt16(rd["codigo"]);
                    infoCategoriaFuncionario.Descricao = rd["descricao"].ToString();
                    lst.Add(infoCategoriaFuncionario);
                }
                return lst;
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "mCategoriaFuncionario ICategoriaFuncionarioDao<mCategoriaFuncionario>.GetLista(short Empresa)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            finally
            {
                rd.Close();
            }
            return lst;
        }

        short ICategoriaFuncionarioDao<mCategoriaFuncionario>.GetCodigo(string Descricao, short Empresa)
        {
            short retorno = 0;

            DbDataReader rd = null;
            DbCommand _cmd = null;
            DbParameter p = null;

            try
            {
                _cmd = EngineBD.GetConexao.CreateCommand();
               
                _cmd.CommandType = CommandType.Text;
                _cmd.CommandText = cmdRetornaCodigo;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_DESCRICAO";
                p.Value = Descricao;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                rd = EngineBD.ExecuteDataReader(_cmd);

                if (rd.Read())
                    retorno = Convert.ToInt16(rd["codigo"]);
            }
            finally
            {
                rd.Close();
            }
            return retorno;
        }

        string ICategoriaFuncionarioDao<mCategoriaFuncionario>.GetDescricao(int Codigo, short Empresa)
        {
            string retorno = String.Empty;

            DbDataReader rd = null;
            DbCommand _cmd = null;
            DbParameter p = null;

            try
            {
                _cmd = EngineBD.GetConexao.CreateCommand();
                                
                _cmd.CommandType = CommandType.Text;
                _cmd.CommandText = cmdRetornaNome;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_CODIGO";
                p.Value = Codigo;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                rd = EngineBD.ExecuteDataReader(_cmd);

                if (rd.Read())
                    retorno = rd["descricao"].ToString();
            }
            finally
            {
                rd.Close();
            }
            return retorno;
        }
        #endregion

        #region Metodos privados
        private mCategoriaFuncionario GetRd(DbDataReader rd)
        {
            infoCategoriaFuncionario = new mCategoriaFuncionario();

            infoCategoriaFuncionario.Codigo = Convert.ToInt16(rd["codigo"]);
            infoCategoriaFuncionario.DataCadastro = Convert.ToDateTime(rd["datacadastro"]);
            infoCategoriaFuncionario.CodigoEmpresa = Convert.ToInt16(rd["empresa"]);
            infoCategoriaFuncionario.DataAlteracao = Convert.ToDateTime(rd["dataalteracao"]);
            infoCategoriaFuncionario.Ativo = Convert.ToBoolean(rd["ativo"]); 
            infoCategoriaFuncionario.Descricao = rd["descricao"].ToString();

            return infoCategoriaFuncionario;
        }
        private void GeraParametro(ref DbCommand _cmd, mCategoriaFuncionario infoCategoriaFuncionario, byte Acao)
        {
            _cmd.Parameters.Clear();
            JMIUtil jmiUtil = new JMIUtil();

            if (Acao == 1)
            {
                infoCategoriaFuncionario.Codigo = (short)UtilBD.GetID(EngineBD.GetConexao, "cadastro.categoriafuncionario", "codigo", infoCategoriaFuncionario.CodigoEmpresa);
                UtilBD.AdicionaParametro(ref _cmd, "@codigo", infoCategoriaFuncionario.Codigo);
                UtilBD.AdicionaParametro(ref _cmd, "@empresa", infoCategoriaFuncionario.CodigoEmpresa);
                UtilBD.AdicionaParametro(ref _cmd, "@usuario", infoCategoriaFuncionario.CodigoUsuario);
                UtilBD.AdicionaParametro(ref _cmd, "@datacadastro", infoCategoriaFuncionario.DataCadastro);
            }
            // usuario=@usuario, 
            //                          dataalteracao=@dataalteracao, ativo=@ativo, descricao=@descricao
            UtilBD.AdicionaParametro(ref _cmd, "@usuario", infoCategoriaFuncionario.CodigoUsuario);
            UtilBD.AdicionaParametro(ref _cmd, "@dataalteracao", infoCategoriaFuncionario.DataAlteracao);
            UtilBD.AdicionaParametro(ref _cmd, "@ativo", infoCategoriaFuncionario.Ativo);
            UtilBD.AdicionaParametro(ref _cmd, "@descricao", infoCategoriaFuncionario.Descricao);
        }
        #endregion
    }
}
